'use strict'

process.chdir(__dirname)

const titbit = require('titbit')
const fs = require('fs')
const pg = require('pg')
const dbconfig = require('./dbconfig.js')
const wxkey = require('./wxkey.js')
const token = require('titbit-token')
const tbload = require('titbit-loader')

let tok=new token({
    //token有效期，单位是秒
    expires:30,
    //必须是32位有效数字字母
    key:'1hdddkkkkcccccoooo98765444433322',
    //必须是16位有效数字字母
    iv:'1234567890opolmn'
})

// 使用HTTP/1.1的客户端
const {httpcli} = require('gohttp')

// 初始化数据库连接
let psql = new pg.Pool(dbconfig)

try{
    fs.accessSync('./images')
}catch(err){
    fs.mkdirSync('./images')
}

let cert_path = '/usr/local/share'

const app = new titbit({
    // 开启调试模式，会输出错误信息
    debug:true,
    globalLog:true,
    cert:`${cert_path}/wx.original5.xyz.pem`,
    key:`${cert_path}/wx.original5.xyz.key`
})

let tb = new tbload();
tb.init(app);

//在app.service对象上添加一个属性
app.addService('tok',tok);
app.addService('psql',psql)
app.addService('imagePath',`${__dirname}/images`)


/**  ---------------content 路由---------------- */
// app.get('/content',async c =>{
//     let sqltext = 'SELECT id, title, update_time FROM content'
//     let r = await psql.query(sqltext)

//     c.send( r.rows)
// })
// app.post('/content',async c =>{
//     try{
//         // c.body是提交的请求体数据
//         let data = JSON.parse(c.body)
//         let sqltext = 'INSERT INTO content'
//             + '(id, detail, title, add_time, update_time)'
//             + ' VALUES($1, $2, $3, $4, $5)'

//         // 随机数转成16进制字符串并去掉前两位，字符串作为ID
//         let id = Math.random().toString(16).substring(2)
//         let tm = Date.now()

//         let r = await VideoPlaybackQuality.query(sqltext,[
//             id, data.detail, data.title, tm, tm
//         ])

//         if(r.rowCount === 0 ){
//             return c.status(500).send('faild')
//         }

//         c.send(id)

//     }catch(err){
//         console.log(err)
//         c.status(400).send('bad data')
//     }
// })
// app.get('/content/:id',async c =>{
//     let id = c.param.id

//     let sqltext = 'SELECT id, detail, title, update_time '
//         + ' FROM content WHERE id=$1';
//     let r = await psql.query(sqltext,[ id ])

//     if(r.rowCount === 0 ){
//         return c.status(404).send('not found')
//     }

//     c.send(r.rows[0])
// })
/** -----------------content  END---------------- */

// c 就是 context
app.get('/',async c=>{
    c.send('ok')
})

app.get('/upload',async c=> {
    // c.helper 是助手函数模块，其中有对stream.pipe 的封装
    // c.reply 是响应对象，http/1.1 中指向 response, http/2 中指向 stream
    await c.helper.pipe('./upload.html', c.reply)
})

app.post('/upload',async c=>{
    let f = c.getFile('file')

    if(!f){
        return c.status(400).send('file not found')
    }

    // 生成唯一文件名
    let fname = c.helper.makeName(f.filename)

    // fetch('./upload',{
    //     method:POST,
    //     body:fm
    // })
    // .then(res=>{
    //     if(res.ok){
    //         return res.text();
    //     }
    //     throw new Error(`${res.status} ${res.statusText}`)
    // })
    // .then(text=>{
    //     let d = document.getElementById('ret-content');
    //     d.innerHTML=`<img src="/image/${text}" style="width:80%;height:auto;">`
    // })
    // .catch(err=>{
    //     console.error(err.message);
    // });

    try{
        await c.moveFile(f,`./images/${fname}`)
        c.send(fname)
    }catch(err){
        c.status(500).send('failed')
    }
})

app.get('/image/:name',async c=>{
    let imgname = c.param.name

    try {
        await c.helper.pipe(`./images/${imgname}`,c.reply)
    }catch(err){
        c.status(404).send('image not found')
    }
})

app.get('/user/:name/:age/:mobile',async c=>{
    console.log(c.param)
    c.send(c.param)
})

app.get('/mp-login/:code', async c=>{
    c.send(c.param)
    let auth_url = `https://api.weixin.qq.com/sns/jscode2session`
        + `?appid=${wxkey.appid}`
        + `&secret=${wxkey.secret}`
        + `&js_code=${c.param.code}`
        + `&grant_type=authorization_code`

    let ret = await httpcli.get(auth_url)
                            .then(res=>{
                                return res.json()
                            })
    c.send( tok.make(ret) )
    
})

// app.delete('/content/:id', async c=>{
//     let r = await psql.query(`DELETE FROM content WHERE id=$1`,
//         [ c.param.id]
//     )
//     c.send({
//         count:r.rowCount
//     })
// })

// // JS 无需加分号，谁用谁知道，有时也得加分号，括号开头很重要
// ;(async ()=>{

// })();

// 监听1234端口运行服务
app.run(2001)
